package com.java.simple.study.juc.p3;

import com.java.simple.study.tool.Sleeper;
import lombok.extern.slf4j.Slf4j;

/**
 * @author zhoujl
 * @date 2022/5/8 21:17
 * @desc
 */
@Slf4j(topic = "c.TestWaitNotify")
public class TestWaitNotify {

    final static Object obj = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (obj) {
                log.debug("t1执行...");
                try {
                    obj.wait(); // 先释放obj锁 然后让线程在此一直等待（不占用CPU时间片）
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("t1其它代码");
            }
        }, "t1").start();

        new Thread(() -> {
            synchronized (obj) {
                log.debug("t2执行...");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("t2其它代码");
            }
        }, "t2").start();
        // 主线程两秒后执行
        Sleeper.sleep(2);
        log.debug("唤醒obj上的其它线程");
        //Exception in thread "main" java.lang.IllegalMonitorStateException
        // 未获得到锁不能调用
        //obj.notifyAll();
        synchronized (obj) {
            //obj.notify(); // 随机唤醒一个线程
            obj.notifyAll(); //唤醒obj上所有线程
        }
    }

}
